package java学习.leetcode.editor.cn;

import java.util.HashSet;
import java.util.Set;

/**
 * @author 刘世锦
 * 2022-10-07 12:11:27	 当前时间
 */
//编写一个算法来判断一个数 n 是不是快乐数。 
//
// 「快乐数」 定义为： 
//
// 
// 对于一个正整数，每一次将该数替换为它每个位置上的数字的平方和。 
// 然后重复这个过程直到这个数变为 1，也可能是 无限循环 但始终变不到 1。 
// 如果这个过程 结果为 1，那么这个数就是快乐数。 
// 
//
// 如果 n 是 快乐数 就返回 true ；不是，则返回 false 。 
//
// 
//
// 示例 1： 
//
//
//输入：n = 19
//输出：true
//解释：
//12 + 92 = 82
//82 + 22 = 68
//62 + 82 = 100
//12 + 02 + 02 = 1
// 
//
// 示例 2： 
//
// 
//输入：n = 2
//输出：false
// 
//
// 
//
// 提示： 
//
// 
// 1 <= n <= 231 - 1 
// 
// Related Topics 哈希表 数学 双指针 
// 👍 1083 👎 0

public class 快乐数{
	public static void main(String[] args) {
		Solution solution = new 快乐数().new Solution();
		System.out.println(solution.isHappy(2));
	}
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
	//输入：n = 19
	//输出：true
	//解释：
	//1^2 + 9^2 = 82
	//8^2 + 2^2 = 68
	//6^2 + 8^2 = 100
	//1^2 + 0^2 + 0^2 = 1

	/**
	 *  对于一个正整数，每一次将该数替换为它每个位置上的数字的平方和。
	 *  然后重复这个过程直到这个数变为 1，也可能是 无限循环 但始终变不到 1。
	 *  如果这个过程 结果为 1，那么这个数就是快乐数。
	 *  快乐数：最后结果=1
	 *  不是快乐数： 1. 最终无法变成1：一直循环
	 *  		  2.  最终结果不是1
	 *
	 */
	public boolean isHappy(int n) {
		Set<Integer> set = new HashSet<Integer>();
		n = getNext(n);
		while (n!=1){

			if (set.contains(n)){
				return false;
			}
			set.add(n);
			n = getNext(n);
		}
		return true;

	}
	public int getNext(int n){
		int res = 0;
		while (n!=0){
			res+=(n%10)*(n%10);
			n/=10;
		}
		return res;
	}

	public boolean isHappy2(int n) {
		HashSet<Integer> set = new HashSet<>();
		while (n!=1){
			int sum=0;
			while (n>0){
				sum=sum+(n%10)*(n%10);
				n=n/10;
			}
			if (set.contains(sum)){
				break;
			}
			set.add(sum);
			n=sum;
		}
		return n==1;
	}
}
//leetcode submit region end(Prohibit modification and deletion)

}
